/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mx.uam.ayd.dulceria.persistencia.dao;

import java.util.List;
import java.util.ArrayList;

import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;

import mx.uam.ayd.dulceria.dominio.Producto;
import mx.uam.ayd.dulceria.persistencia.ManejadorBD;


/**
 *
 * @author christian
 */
public class ProductoDAO_Derby implements ProductoDAO{


	/**
	 * Constructor, no hace nada
	 */
    public ProductoDAO_Derby(){

    }

    /**
     * metodo para crear un nuevo producto en la base de datos
     * @param p el producto que se quiere introducir
     * @return true si se logra la insercion, false en otro caso
     */
    public boolean crea(Producto p){
    	int identificador=obtenerUltimoIndice()+1;
        try{
            Statement sentencia = ManejadorBD.dameConnection().createStatement();

            sentencia.execute("INSERT INTO Productos(id, nombre, descripcion, marca, preciocompra, precioventa, cantidadexistente, cantidadminima)"
                    +" VALUES("+identificador+",'"+p.getNombre().toLowerCase()+"','"+p.getDescripcion()+"','"+p.getMarca()+"',"+p.getPrecioDeCompra()+","+p.getPrecioDeVenta()+","+p.getCantidadExistente()+","+p.getMinimaCantidad()+")");

            return true;
        }catch(SQLException e){
        	e.printStackTrace();
            return false;
        }
    }

    /**
     * metodo que recupera un producto de la base de datos
     * @param nombre nombre del producto buscado
     * @return el producto si lo encuentra, null en otro caso
     */
    public Producto recupera(String nombre) {
        try{
            Statement sentencia = ManejadorBD.dameConnection().createStatement();
            ResultSet rs = sentencia.executeQuery("SELECT * FROM Productos WHERE nombre='"+nombre.toLowerCase()+"'");

            if(!rs.next())
            {
                return null;
            }
            Producto p=new Producto(rs.getString("nombre"), rs.getString("descripcion"), rs.getString("marca"),
                    rs.getInt("preciocompra"));
            p.setCantidadExistente(rs.getInt("cantidadexistente"));
            p.setPrecioDeVenta(rs.getInt("precioventa"));
            p.setMinimaCantidad(rs.getInt("cantidadminima"));

            return p;

        }catch(SQLException e){
        	e.printStackTrace();
            return null;
        }

    }

    /**
     * metodo que recupera un producto de la base de datos
     * @param id identificador que tiene asignado en la base de datos
     * @return el producto si lo encuentra, null en otro caso
     */
    public Producto recupera(int id){
    	try{
            Statement sentencia = ManejadorBD.dameConnection().createStatement();
            ResultSet rs = sentencia.executeQuery("SELECT * FROM Productos WHERE id="+id);

            if(!rs.next())
            {
                return null;
            }
            Producto p=new Producto(rs.getString("nombre"), rs.getString("descripcion"), rs.getString("marca"),
                    rs.getInt("preciocompra"));
            p.setCantidadExistente(rs.getInt("cantidadexistente"));
            p.setPrecioDeVenta(rs.getInt("precioventa"));
            p.setMinimaCantidad(rs.getInt("cantidadminima"));

            return p;

        }catch(SQLException e){
        	e.printStackTrace();
            return null;
        }
    }

    /**
     * metodo que permite buscar productos cuyo nombre sea similar al especificado
     * @param nombre nombre del producto
     * @return lista de productos encontrados o null
     */
    public List<Producto> busca(String nombre){
    	ArrayList<Producto> productos=new ArrayList<Producto>();

        try{
        	Statement sentencia = ManejadorBD.dameConnection().createStatement();
        	ResultSet rs = sentencia.executeQuery("SELECT * FROM Productos WHERE nombre LIKE '%"+nombre.toLowerCase()+"%'");

        	/*if(!rs.next()){
        		return null;
        	}*/
        	while(rs.next()){
        		Producto p = new Producto(rs.getString("nombre"), rs.getString("descripcion"), rs.getString("marca"),
                        rs.getInt("preciocompra"));
                p.setCantidadExistente(rs.getInt("cantidadexistente"));
                p.setPrecioDeVenta(rs.getInt("precioventa"));
                p.setMinimaCantidad(rs.getInt("cantidadminima"));

                productos.add(p);
        	}
        	return productos;
        }catch(SQLException e){
        	e.printStackTrace();
        	return null;
        }
    }

    /**
     * metodo para actualizar el estado de un producto en la base de datos
     * @param el producto que se desea actualizar
     * @return true si se logra actualizar, false en otro caso
     */
    public boolean actualiza(Producto p) {
        try{
            Statement sentencia = ManejadorBD.dameConnection().createStatement();

            sentencia.execute("UPDATE Productos "
                    + "SET "
                    + "descripcion='"+p.getDescripcion()+"',"
                    + "marca='"+p.getMarca()+"',"
                    + "preciocompra="+p.getPrecioDeCompra()+","
                    + "precioventa="+p.getPrecioDeVenta()+","
                    + "cantidadexistente="+p.getCantidadExistente()+","
                    + "cantidadminima="+p.getMinimaCantidad()
                    + "WHERE nombre='"+p.getNombre()+"'");
            return true;
        }catch(SQLException e){
        	e.printStackTrace();
            return false;
        }
    }


    public boolean borra(Producto p) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


    /**
     * Metodo para recuperar todos los elementos de la base de datos
     * @return una lista con los productos recuperados
     */
    public List<Producto> recuperaTodos() {
        ArrayList<Producto> productos=new ArrayList<Producto>();

        try{
        	Statement sentencia = ManejadorBD.dameConnection().createStatement();
        	ResultSet rs = sentencia.executeQuery("SELECT * FROM Productos");

        	while(rs.next()){
        		Producto p = new Producto(rs.getString("nombre"), rs.getString("descripcion"), rs.getString("marca"),
                        rs.getInt("preciocompra"));
                p.setCantidadExistente(rs.getInt("cantidadexistente"));
                p.setPrecioDeVenta(rs.getInt("precioventa"));
                p.setMinimaCantidad(rs.getInt("cantidadminima"));

                productos.add(p);
        	}
        	return productos;
        }catch(SQLException e){
        	e.printStackTrace();
        	return null;
        }
    }

    /**
     * metodo para obtener el ultimo id usado en la tabla de productos
     * @return el ultimo id usado, 0 si la tabla esta vacia
     */
    private int obtenerUltimoIndice(){
    	try{
            Statement sentencia = ManejadorBD.dameConnection().createStatement();
            ResultSet rs = sentencia.executeQuery("SELECT id FROM Productos ORDER BY id DESC");

            if(!rs.next())
            {
                return 0;
            }
            return rs.getInt(1);
        }catch(SQLException e){
        	e.printStackTrace();
            return 0;
        }
    }
}
